Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - [GUI][Swing]Problema con GridBagLayout
Forum - Java - [GUI][Swing]Problema con GridBagLayout

Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 22:15
Martedì, 04/11/2014
Salve a tutti, è da un po' che non riesco a risolvere un problema con il GridBagLayout. Ho cercato e provato vari metodi ma niente, non riesco a capire come fare. In pratica io ho scritto questo codice
Codice sorgente - presumibilmente Java

  1. JPanel polyEditorPanel = new JPanel();
  2.         JList polyVertices = new JList(polyVerticesModel);
  3.         JButton polyAddVertex = new JButton("Add vertex");
  4.         JButton polyRemoveVertex = new JButton("Remove vertex");
  5.         JSpinner polyVertexX = new JSpinner();
  6.         JSpinner polyVertexY = new JSpinner();
  7.         JButton polyEditVertex = new JButton("Edit");
  8.  
  9.          //...
  10.  
  11.                 polyEditorPanel.setLayout(new GridBagLayout());
  12.                 GridBagConstraints gc = new GridBagConstraints();
  13.                 gc.fill = GridBagConstraints.BOTH;
  14.                 gc.gridwidth = 3;
  15.                 gc.gridheight = 2;
  16.                 //gc.weightx = 0.5;
  17.                 gc.anchor = gc.WEST;
  18.                 polyEditorPanel.add(polyVertices, gc);
  19.                 gc.anchor = gc.EAST;
  20.                 //gc.weightx = 1;
  21.                 gc.gridwidth = 1;
  22.                 gc.gridheight = 1;
  23.                 gc.gridx = 3;
  24.                 gc.gridy = 0;
  25.                 polyEditorPanel.add(polyAddVertex, gc);
  26.                 gc.gridx = 4;
  27.                 polyEditorPanel.add(polyRemoveVertex, gc);     
  28.                 gc.gridx = 3;
  29.                 gc.gridy = 1;
  30.                 polyEditorPanel.add(polyVertexX, gc);  
  31.                 gc.gridx = 4;
  32.                 polyEditorPanel.add(polyVertexY, gc);  
  33.                 gc.gridx = 5;
  34.                 polyEditorPanel.add(polyEditVertex, gc);


Da cui ottengo questo risultato: http://i.imgur.com/nHrkndX.png
Il problema è che vorrei che la JList (che nell'immagine contiene un elemento con scritto "ciao") fosse più larga (dovrebbe occupare metà del contenitore) e i pulsanti e i JSpinner più piccoli.
Ho cercato varie guide sul GridBagLayout e ho scoperto che è abbastanza complesso... il mio problema centra forse con la distribuzione dei "pesi" (weightx, weighty)? Perchè quelli proprio non ho capito come funzionano... ho provato ad agire sul controllo (con setSize, setMinimunSize) ma niente il risultato è sempre quello.

Qualcuno saprebbe gentilmente indicarmi dove sbaglio e come potrei risolvere? Grazie ;)

PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 437
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 12:19
Mercoledì, 05/11/2014
Concordo con la complessità di GridBagLayout :)

Io ho provato a smanettare e ho notato che la larghezza del JList dipende dalla lunghezza della stringa (i valori intendo nel nostro caso "ciao"). Infatti se provi ad inserire una parola più lunga il JList si ridimensiona.
Però questo non è il massimo, quindi ho impostato una dimensione fissa delle celle del JList, in questo modo:

Codice sorgente - presumibilmente Java

  1. Object[] data = {"ciao"};
  2.    
  3.     JPanel polyEditorPanel = new JPanel();
  4.     JList polyVertices = new JList(data);
  5.    
  6.     //Fixed a 200
  7.     polyVertices.setFixedCellWidth(200);
  8.    
  9.     JButton polyAddVertex = new JButton("Add vertex");
  10.     JButton polyRemoveVertex = new JButton("Remove vertex");
  11.     JSpinner polyVertexX = new JSpinner();
  12.     JSpinner polyVertexY = new JSpinner();
  13.     JButton polyEditVertex = new JButton("Edit");
  14.  
  15.     //...
  16.     polyEditorPanel.setLayout(new GridBagLayout());
  17.     gc.fill = GridBagConstraints.BOTH;
  18.     gc.gridwidth = 3;
  19.     gc.gridheight = 2;
  20.     //gc.weightx = 0.5;
  21.     gc.anchor = gc.WEST;
  22.     polyEditorPanel.add(polyVertices, gc);
  23.     gc.anchor = gc.EAST;
  24.     //gc.weightx = 1;
  25.     gc.gridwidth = 1;
  26.     gc.gridheight = 1;
  27.     gc.gridx = 3;
  28.     gc.gridy = 0;
  29.     polyEditorPanel.add(polyAddVertex, gc);
  30.     gc.gridx = 4;
  31.     polyEditorPanel.add(polyRemoveVertex, gc);
  32.     gc.gridx = 3;
  33.     gc.gridy = 1;
  34.     polyEditorPanel.add(polyVertexX, gc);
  35.     gc.gridx = 4;
  36.     polyEditorPanel.add(polyVertexY, gc);
  37.     gc.gridx = 5;
  38.     polyEditorPanel.add(polyEditVertex, gc);
  39.    
  40.     JFrame f = new JFrame();
  41.     f.setVisible(true);
  42.     f.setBounds(0, 0, 500, 300);
  43.     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  44.     f.getContentPane().add(polyEditorPanel);



così si allarga, potrebbe essere una soluzione.

PS: A suo tempo quando studiai Swing, avevo trovato questo tutorial su GridBagLayout
https://drive.google.com/file/d/0ByNkKJSEWSy9ZTI4MktWTzJ6aV ...
A mio parere, fatto bene.

PS2 :): Per carità è giusto all'inizio farle a mano queste cose. Per capire le lib javax.swing... ma dopo un pò ti accorgi che ci sono strumenti potentissimi per far ciò, con drag&drop e click!! Detto questo ti consiglio di provare NetBeans. (crea un progetto java -> tasto destro scegli "JForm form .." )

Ultima modifica effettuata da Bonny il 05/11/2014 alle 12:40
PM Quote
Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 19:48
Mercoledì, 05/11/2014
Perfetto, grazie mille!! :k:
Il metodo setFixedCellWidth era proprio quello che cercavo.

PM Quote